package com.happysheep.pma.logging;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Aspect
@Component
public class ApplicationLoggerAspect {

    private final Logger log = LoggerFactory.getLogger(this.getClass());

    @Pointcut("within(com.happysheep.pma.controllers..*)" + "|| within(com.happysheep.pma.dao..*)" )
    public void definePackagePointcuts(){

    }
////   @Before("definePackagePointcuts()")
////  public void logBefore(JoinPoint joinPoint){
////     log.debug("\n\n\n");
////        log.debug("*******************方法执行前*********************");
//        log.debug(
//                "{},{}(),输入参数{}",
//                joinPoint.getSignature().getDeclaringTypeName(),
//                joinPoint.getSignature().getName(),
//                Arrays.toString(joinPoint.getArgs())
//        );
//        log.debug("----------------------------------");
//        log.debug("\n\n\n");
//    }
//
//    @After("definePackagePointcuts()")
//    public void logAfter(JoinPoint joinPoint){
//        log.debug("\n\n\n");
//        log.debug("**********************方法执行后************************");
//        log.debug(
//                "{},{}(),输入参数{}",
//                joinPoint.getSignature().getDeclaringTypeName(),
//                joinPoint.getSignature().getName(),
//                Arrays.toString(joinPoint.getArgs())
//        );
//        log.debug("-----------------------------------------------------");
//        log.debug("\n\n\n");
//    }

    @Around("definePackagePointcuts()")
    public Object logAround(ProceedingJoinPoint proceedingJoinPoint)throws Throwable{
        log.debug("\n\n\n");
        log.debug("*********************方法执行前**********************");
        log.debug(
                "{},{}(),输入参数{}",
                proceedingJoinPoint.getSignature().getDeclaringTypeName(),
                proceedingJoinPoint.getSignature().getName(),
                Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("--------------------------------------------------");
        log.debug("\n\n\n");

        Object object = null;
        try {
            object = proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }

        log.debug("\n\n\n");
        log.debug("*************************方法执行后*******************");
        log.debug(
                "{},{}(),输入参数{}",
                proceedingJoinPoint.getSignature().getDeclaringTypeName(),
                proceedingJoinPoint.getSignature().getName(),
                Arrays.toString(proceedingJoinPoint.getArgs())
        );
        log.debug("--------------------------------------------------");
        log.debug("\n\n\n");

        return object;


    }

}
